<template>
    <div>
        <h1>我在{{ school }} 学习，{{ subject }}</h1>
        <h1>当前和：{{ sum }}</h1> 模板里面可以省略this，因为它可以看到 vc身上的所有东西<br>
        <h1>放大10倍：{{ bigSum }}</h1>
        <select v-model.number="n">
            <option value="1">1</option>
            <option value="2">2</option>
            <option value="3">3</option>
        </select>
        <button @click="increament">+</button>
        <button @click="decreament">-</button>
        <button @click="increamentOdd">当前和 是奇数才能加</button>
        <button @click="increamentWait">延迟500毫秒地加</button>
    </div>
</template>

<script>
import Vue from 'vue';
import { mapState,mapGetters } from 'vuex';
export default Vue.extend({
    name: 'Count',
    data() {
        return {
            n: 1,
        }
    },
    methods: {
        increament() {
            // this.$store.commit('JIA', this.n) // 不推荐写法：vc用commit 直接跟 mutations 对话，相当于跳过了 actions
            this.$store.dispatch('jia', this.n) // 推荐写法：1.vc先用dispatch 先跟 actions 对话，然后 actions 再跟 mutations 对话
            // this.$store.state.sum+=1 // 超级不推荐写法：直接操作 store。其他人没法复用这个逻辑
        },
        decreament() {
            this.$store.dispatch('jian', this.n)
        },
        increamentOdd() {
            this.$store.dispatch('jiaOdd', this.n)
        },
        increamentWait() {
            this.$store.dispatch('jiaWait', this.n)
        },
    },
    computed: {
        /* 1.普通computed写法简化 this.$store.state 这一大串东西
        he() {
            return this.$store.state.sum
        },
        xuexiao() {
            return this.$store.state.school
        },
        xueke() {
            return this.$store.state.subject
        },
        */
        /* bigSum() {
            return this.$store.getters.bigSum
        }, */
        /*  mapState方式简化，它返回一个{函数1:函数1内容,函数2:函数2内容。。。}形式的对象，用ES6展开进computed
            详细阅读README.md，搜索关键词：ES6对象展开运算符
            简洁而高效地将 Vuex store 中的状态映射到 Vue 组件的计算属性中
        */
        // ...mapState({ 'he': 'sum', 'xuexiao': 'school', 'xueke': 'subject' }), // 1.对象写法：可以改生成的名字，个人喜欢这种写法
        ...mapState(['sum', 'school', 'subject']), // 2.数组写法：state是什么名字，最终生成的就是什么名字
        ...mapGetters({ 'bigSum': 'bigSum' }), // 同理的getters映射的对象写法
        ...mapGetters(['bigSum']),// 同理的getters映射的数组写法
    },
    mounted() {
        console.log("Count", this);
        // 'key'：'value' 都该传字符串，key可以省略引号，但value不行，不打引号vc会去找sum这个变量，我们vc这里当然没有
        const temp = mapState({ 'he': 'sum', 'xuexiao': 'school', 'xueke': 'subject' })
        // 打印的是{he: ƒ, xuexiao: ƒ, xueke: ƒ} 返回的是一个 对象，key是函数名，value是函数体，我们可以用ES6展开进computed
        console.log("mapState返回：", temp);

    }
}) 
</script>

<style>
button {
    margin: 3px;
}
</style>